#pragma once
#include "base/core/os/os_head.h"
#include "base/core/com_define.h"

#if defined(WIN32)
  typedef   CRITICAL_SECTION  MUTEX_HANDLE;
#elif defined(OS_LINUX)
  typedef   pthread_mutex_t   MUTEX_HANDLE;
#endif  // OS

bool InitMutex(MUTEX_HANDLE * mutex_handle);
bool DeleteMutex(MUTEX_HANDLE * mutex_handle);
bool LockMutex(MUTEX_HANDLE * mutex_handle);
bool TryLockMutex(MUTEX_HANDLE * mutex_handle);
bool UnlockMutex(MUTEX_HANDLE * mutex_handle);

class MutexLock 
{
protected:
	bool          is_init_;
	MUTEX_HANDLE  mutex_handle_;

public:
	MutexLock()
		:is_init_(false) 
	{
		if (InitMutex(&mutex_handle_))
			is_init_ = true;
	}

	~MutexLock() 
	{
	if (is_init_)
		DeleteMutex(&mutex_handle_);
	}

	bool Lock() 
	{
	MMO_ASSERT(is_init_);
	if (!is_init_)
		return  false;
	return LockMutex(&mutex_handle_);
	}

	bool TryLock() 
	{
	MMO_ASSERT(is_init_);
	if (!is_init_)
		return  false;
	return TryLockMutex(&mutex_handle_);
	}

	bool Unlock() 
	{
	MMO_ASSERT(is_init_);
	if (!is_init_)
		return  false;
	return UnlockMutex( &mutex_handle_ );
	}
};

